﻿using System.Collections.Generic;
using EntitiesAndMappings.Entities;
using NHibernate;
using NHibernate.Criterion;
using NHibernate.SqlCommand;
using ProyectoSelva.Dtos;

namespace ProyectoSelva.Daos
{
    public class ConsultasDAO
    {
        public static ISessionFactory CreateSessionFactory()
        {

            return SessionFactoryHelper.GetSessionFactory();
        }

        public static IList<Trabajador> consultaDePersonal(ConsultaPersonalParams parametros)
        {
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    ICriteria criteria = session
                   .CreateCriteria(typeof(Trabajador), "Trabajador")
                   .CreateAlias("TipoDocumento", "TipoDocumento", JoinType.InnerJoin)
                   .CreateAlias("NivelEstudios", "NivelEstudios", JoinType.InnerJoin);

                    if (parametros.Apellidos.Trim().CompareTo(string.Empty) != 0)
                    {
                        criteria.Add(Expression.InsensitiveLike("Trabajador.NumeroDocumento", parametros.NumeroDocumento,
                                                                MatchMode.Start));
                    }

                    if (parametros.Apellidos.Trim().CompareTo(string.Empty) != 0)
                    {
                        criteria.Add(Expression.InsensitiveLike("Trabajador.Apellidos", parametros.Apellidos,
                                                                MatchMode.Start));
                    }
                    if (parametros.Nombres.Trim().CompareTo(string.Empty) != 0)
                    {
                        criteria.Add(Expression.InsensitiveLike("Trabajador.Nombres", parametros.Apellidos,
                                                                MatchMode.Start));
                    }

                    if (parametros.ConsiderarFechaIngreso)
                    {
                        criteria.Add(Expression.Between("Trabajador.FechaIngreso", parametros.FechaIngresoDesde, parametros.FechaIngresoHasta));
                    }

                    if (parametros.ConsiderarFechaNacimiento)
                    {
                        criteria.Add(Expression.Between("Trabajador.FechaNacimiento", parametros.FechaIngresoDesde, parametros.FechaIngresoHasta));
                    }

                    if (parametros.ConsiderarNivelEstudios)
                    {
                        criteria.Add(Expression.Eq("NivelEstudios.Id", parametros.IdNivelEstudios));
                    }

                    if (parametros.ConsiderarAsignacionFamiliar)
                    {
                        criteria.Add(Expression.Eq("Trabajador.AsignacionFamiliar", parametros.AsignacionFamiliar));

                    }

                    return criteria.List<Trabajador>();

                }


            }
        }

        public static IList<Contrato> consultaDeRenovaciones(ConsultaRenovacionesParams parametros)
        {
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    ICriteria criteria = session
                   .CreateCriteria(typeof(Contrato), "Contrato")
                   .CreateAlias("Trabajador", "Trabajador", JoinType.InnerJoin)
                   .CreateAlias("TipoCargo", "TipoCargo", JoinType.InnerJoin)
                   .CreateAlias("Lote", "Lote", JoinType.InnerJoin)
                   .CreateAlias("Proyecto", "Proyecto", JoinType.InnerJoin)
                    .CreateAlias("MotivoLiquidacion", "MotivoLiquidacion", JoinType.InnerJoin)
                   .CreateAlias("StatusContrato", "StatusContrato", JoinType.InnerJoin)
                   ;


                    if (parametros.Apellidos.Trim().CompareTo(string.Empty) != 0)
                    {
                        criteria.Add(Expression.InsensitiveLike("Trabajador.Apellidos", parametros.Apellidos,
                                                                MatchMode.Start));
                    }
                    if (parametros.Nombres.Trim().CompareTo(string.Empty) != 0)
                    {
                        criteria.Add(Expression.InsensitiveLike("Trabajador.Nombres", parametros.Apellidos,
                                                                MatchMode.Start));
                    }

                    if (parametros.IdEmpresa != 0)
                    {
                        criteria.Add(Expression.Eq("Contrato.IdEmpresa", parametros.IdEmpresa));
                    }

                    if (parametros.IdProyecto != 0)
                    {
                        criteria.Add(Expression.Eq("Contrato.IdProyecto", parametros.IdProyecto));
                    }

                    if (parametros.IdLote != 0)
                    {
                        criteria.Add(Expression.Eq("Contrato.IdLote", parametros.IdLote));
                    }
                    if (parametros.IdCargo != 0)
                    {
                        criteria.Add(Expression.Eq("Contrato.IdCargo", parametros.IdCargo));
                    }

                    if (parametros.IdStatusContrato != 0)
                    {
                        criteria.Add(Expression.Eq("Contrato.IdStatusContrato", parametros.IdStatusContrato));
                    }

                    if (parametros.IdMotivoLiquidacion != 0)
                    {
                        criteria.Add(Expression.Eq("Contrato.IdMotivoLiquidacion", parametros.IdMotivoLiquidacion));
                    }

                    return criteria.List<Contrato>();

                }


            }
        }



    }
}
